home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / unixlib.lha / unix / src / _setjmp.a < prev    next >
Text File  |  1995-09-11  |  957b  |  41 lines

  1.     XDEF    __setjmp
  2.     XDEF    ___setjmp
  3.     XDEF    @_setjmp
  4.     XDEF    @__setjmp
  5.     XDEF    __longjmp
  6.     XDEF    @_longjmp
  7.  
  8.     XREF    ___alloca_SP
  9.     XREF    __EPILOG
  10.     
  11.     csect    text,0,,2,2
  12.  
  13. __setjmp:
  14. ___setjmp:
  15.     move.l    4(a7),a0        ; Get jmp_buf
  16. @_setjmp:
  17. @__setjmp:
  18.     move.l    (___alloca_SP).l,(a0)+    ; Save virtual SP
  19.     move.l    (a7),(a0)+        ; Save return address
  20.     movem.l    a2-a7/d2-d7,(a0)    ; Save registers
  21.     moveq    #0,d0
  22.     rts
  23.  
  24. __longjmp:
  25.     move.l    4(a7),a0        ; Get jmp_buf
  26.     move.l    8(a7),d0        ; Get result
  27. @_longjmp:
  28.     bne.s    ok
  29.     moveq    #1,d0            ; Return must be != 0
  30. ok    move.l    (a0)+,(___alloca_SP).l    ; Get virtual SP from setjmp call
  31.     movem.l    a0/d0,-(a7)        ; Save jmp_buf and result
  32.     addq.l    #1,(___alloca_SP).l    ; Increment virtual SP
  33.     jsr    __EPILOG        ; Free alloca()ted memory (if any)
  34.     movem.l    (a7)+,a0/d0        ; Restore jmp_buf and result
  35.     move.l    (a0)+,a1        ; Get setjmp call return address
  36.     movem.l    (a0),a2-a7/d2-d7    ; Get registers
  37.     addq.l    #4,a7            ; Pop own return address
  38.     jmp    (a1)            ; And return to setjmp call
  39.  
  40.     end
  41.